/**
* Projet Chat System
* 
* @author Yann MBOUNGOU et Jean-Christophe VENDOME
* ELEVES INGENIEUR - 4e Année - Informatique et Réseaux
* INSA TOULOUSE, Dept. GEI - 2014 - 2015
*/
package GUI;
import Interfaces.*;
import Controller.ChatController;
import java.awt.event.*;
import java.io.File;
import javax.swing.*;
import Sons_Nouveau_Msg.SonSimple;
import java.awt.Font;
import java.net.InetAddress;


public class ChatGUI extends Graphisme implements FromUser, ToUser, ActionListener {
    private ChatController chatController;
    private final DefaultListModel <User> userList;
    private static boolean connected=false;
    private JFileChooser  fileDialog;
    private File file_joined=null ;
    private final MouseListener list; 
    private MsgPrivate prive=null; 
    
     /**
     * README :
     * Cette classe est appelée 
     * à chaque fois qu'on lance notre appli. 
     * Elle complète toutes nos interfaces 
     * graphiques, implémentent toutes nos  
     * actions sur les différents boutons
     * et assure le changement d'une interface
     * à une autre dans le cas d'une connection
     * ou d'une déconnection
     */
    
    @SuppressWarnings({"LeakingThisInConstructor", "Convert2Diamond"})
    public ChatGUI()
    {        
        super();
        connect.addActionListener(this);
        send.addActionListener(this);
        disc.addActionListener(this);
        File.addActionListener(this);
        this.userList=new DefaultListModel <User>();
        initList(userList);
        list = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) 
            {
                 if (e.getClickCount() == 2)
                 {
                     String m=""+getjUserList().getSelectedValue();
                     if(m.equals("users LIST's")==false)
                     {
                        int index = getjUserList().locationToIndex(e.getPoint());                     
                        System.out.println("Double clicked on "+getjUserList().getSelectedValue()+": [Item="+index+"]");                     
                        
                        for(int i=0;i<getUserList().getSize();i++)
                        {
                             User u = getUserList().elementAt(i);
                            if(u.getLogin().equals(m))
                            {
                                prive(u); 
                                u.setmsgPrive(true);
                            }
                       }     
                        
                    }                    
                }
            }};
        getjUserList().addMouseListener(list);
    }
    //*************************************************//
    public void prive(User u)
    {
       prive=new MsgPrivate(u); 
       prive.setGui(this); 
    }

    //*************************************************//
     @Override
    @SuppressWarnings("ObjectEqualsNull")
    public void connect()                                                                                                                      
    {      
        String m=""+displayLogin();
        String m2="";
        if(m.equals(m2)==false) //<===== on verifie si l'utilisateur a bien renseigné son login
        {
            connected();
            getChatController().performConnect(displayLogin());
            jFrame1.setVisible(false);
            setVisible(true);
            Font police= new Font("Tahoma",Font.ITALIC,16);
            getjUserList().setFont(police);
            scroll.setViewportView(getjUserList()); 
        }
        else
        {
            label3.setForeground(new java.awt.Color(255, 0, 0));
        }
       
    }
    
     @Override
    public void disconnect()                                                                          
    {        
        getChatController().performDisConnect();
        setVisible(false); 
        jFrame1.setVisible(true);      
        disconnected();
    }
    
    @Override
    public void send()                                                                                        
    {
        String m="";
        if(((this.getFile_joined() == null)==false)&& (jftmessage.getText().equals(m)==false))
        { //<============== si un msg est associé à un fichier, les deux sont envoyés
            
            msg.append("The file ");
            msg.append(java.awt.Color.orange,this.getFile_joined().getName());
            msg.append(" has been joined \n"); 
            getChatController().performSendFile(displayLogin(),this.getFile_joined().getName()); 
            //***************************************************************//
            msg.append(java.awt.Color.blue,"You");
            msg.append(" : "+jftmessage.getText()+"\n"); 
            getChatController().performSend(displayLogin(),jftmessage.getText());
            jftmessage.setText("");
        }
        else if((jftmessage.getText().equals(m)==false)&&((this.getFile_joined() == null)==true))
        { //<============== si un msg est écrit, et qu'il n'ya pas de piece jointe: le  msg est envoyé
            
            msg.append(java.awt.Color.blue,"You");
            msg.append(" : "+jftmessage.getText()+"\n"); 
            getChatController().performSend(displayLogin(),jftmessage.getText());
            jftmessage.setText("");
        }
        else if(((this.getFile_joined() == null)==false)&&(jftmessage.getText().equals(m)==true))
        { //<============== si une piece jointe est ajoutée à un msg vide, le fichier est envoyé
            msg.append("The file ");
            msg.append(java.awt.Color.orange,this.getFile_joined().getName());
            msg.append(" has been joined\n"); 
            getChatController().performSendFile(displayLogin(),this.getFile_joined().getName()); 
        }
        
    }
        
    @Override
    public void open()
    {
        if (fileDialog == null) 
        {
            fileDialog = new JFileChooser();    
        }
        int returnVal = fileDialog.showDialog(this,"Join File");
        if (returnVal == JFileChooser.APPROVE_OPTION)
        {
            setFile_joined(fileDialog.getSelectedFile());
            msg.append(java.awt.Color.black,getFile_joined().getName()+ " joined .\n");
        } 
        else 
        {
            msg.append(java.awt.Color.red,"Attachment cancelled by "+displayLogin()+".\n");
        }
        msg.setCaretPosition(msg.getDocument().getLength());        
        fileDialog.setSelectedFile(null);//Reset the file chooser for the next time it's shown.
    }   
      
    @Override
    public void actionPerformed(ActionEvent e)
    {
        Object obj=e.getSource();
        if (obj instanceof JButton)
        {
           JButton b=(JButton)obj;
           if (b==connect) connect();
           else if (b==disc) disconnect();
           else if (b==send) send();
           else if (b==File) open();
        }
    }
    //*****Mise à jour de notre liste d'utilisateurs connectés quand on recoit un hello/ACK**************//    
    public void performList(String login,InetAddress addr)            
    {
        Boolean inList = false;
        System.out.println("performList et connected="+connected);
        if(connected)
        {
            for(int i=0;i<getUserList().getSize();i++)
            {
                User u = getUserList().elementAt(i);
                if(u.getAddr().equals(addr))
                {
                   u.setLogin(login);
                   inList=true;
                }
            } 
            if(inList==false)
            {
              User u=new User(login,addr);
              msg.append(java.awt.Color.blue,u.getLogin());
              msg.append(" is connected\n"); 
              getUserList().addElement(u);
            }
        }       
    }
    
    //*****Mise à jour de notre liste d'utilisateurs connectés quand on recoit un Bye**************//   
    public void performBye(String login)            
    {
        System.out.println("performBye et connected="+connected);
        if(connected)
        {
            synchronized (getUserList())
            {
                for(int i=0;i<getUserList().getSize();i++)
                {
                    User u = getUserList().elementAt(i);
                    if(u.getLogin().equals(login))  
                    {
                        msg.append(java.awt.Color.blue,u.getLogin());
                        msg.append(" is disconnected\n"); 
                        if(u.getmsgPrive()==true)
                        {
                            prive.back(u);
                        }
                        getUserList().removeElement(u);                 
                    }
                    
               } 
            }
        }
        
    }
    //****L'utilisateur est notifié que sa piece jointe a été émise******//
    public void fileSentack()
    {        
        msg.append(java.awt.Color.PINK," File sent\n"); 
        if(this.getFile_joined()!=null)
        {
            this.setFile_joined(null);
        }
        else if(prive.getFile_joined()!=null)
        {
            prive.setFile_joined(null);
        }
        
        
    }
    //****L'utilisateur est notifié qu'il a recu un fichier******//
    public void receivedfile(String login)
    { 
        msg.append(java.awt.Color.BLACK," File received from "+login+" in source folder\n"); 
    }
  
    //*********************Receive Text**************************//
    @Override
    @SuppressWarnings("ResultOfObjectAllocationIgnored")
    public void ReceiveMsg(String login, String message)
    {
        if(connected)
        {
           new SonSimple();
            System.out.println("ReceiveMsg public");
            msg.append(java.awt.Color.green,login+" :");
            msg.append(message+"\n"); 
        }
    }
    //*********************Receive Text**************************//
    @SuppressWarnings("ResultOfObjectAllocationIgnored")
    public void ReceiveMsgPriv(String login, String message)
    {
        if(connected)
        {
            Boolean test = false;
            new SonSimple();
            System.out.println("ReceiveMsg private");
            for(int i=0;i<getUserList().getSize();i++)
            {
                User u = getUserList().elementAt(i);
                if(u.getLogin().equals(login))
                {
                    if(u.getmsgPrive().equals(false))
                    {
                        prive(u);  
                        prive.getDisp().append(java.awt.Color.green,login+" :");
                        prive.getDisp().append(message+"\n");
                        test = true;
                        u.setmsgPrive(true);
                    }
                }
            }   
            if(test == false)
            {
                prive.getDisp().append(java.awt.Color.green,login+" :");
                prive.getDisp().append(message+"\n");
            }   
        }        
    }
    
    //**********************Print Login***************************//
    public void setChatController(ChatController chatController) {
        this.chatController = chatController;
    }

    @Override
    public String displayLogin() {
        return getJftlogin().getText();
    }

    @Override
    public void connected() {
        connected=true;
        msg.setText("");
        msg.append(java.awt.Color.blue,"You");
        msg.append(" are connected\n");  
    }

    @Override
    public void disconnected() {
        connected=false;  
        getJftlogin().setText("");
        getUserList().removeAllElements();
        label3.setForeground(new java.awt.Color(153, 0, 153));
        msg.setText("");          
    }

    //*********************File joinned****************************//
    public File getFile_joined() {
        return file_joined;
    }
  
    public ChatController getChatController() {
        return chatController;
    }

    @Override
    public void openPrivate() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    public DefaultListModel <User> getUserList() {
        return userList;
    }

    @Override
    public void back(User u) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    public void setFile_joined(File file_joined) {
        this.file_joined = file_joined;
    }    
}


